<?php

namespace Framework;

use App\Controllers\ErrorController;
use Framework\Middleware\Authorise;

class Router{
    protected $routes =[];

    private function registerRoute($method,$uri,$action,$middleware = []){

        list($controller,$controllerMethod)=explode('@',$action);

        $this->routes[]=[
            'method'=>$method,
            'uri'=>$uri,
            'controller'=>$controller,
            'controllerMethod'=>$controllerMethod,
            'middleware'=>$middleware
        ];
    }
    public function addGet($uri,$controller,$middleware = []){
        $this->registerRoute('GET',$uri,$controller,$middleware);
    }
    public function addPost($uri,$controller,$middleware= []){
        $this->registerRoute('POST', $uri, $controller,$middleware);
    }
    public function addPut($uri,$controller,$middleware= []){
        $this->registerRoute('PUT',$uri,$controller,$middleware);
    }
    public function addDelete($uri,$controller,$middleware= []){
        $this->registerRoute('DELETE',$uri,$controller,$middleware);
    }
    public function error($httpCode = 404)
    {
        http_response_code($httpCode);
        loadView("error/{$httpCode}");
        exit;
    }

    /**
     * @param string $uri
     * @return void
     */
    public function route($uri){

        $requestMethod = $_SERVER['REQUEST_METHOD'];
        if($requestMethod === 'POST' && isset($_POST['_method'])){
            $requestMethod = strtoupper($_POST['_method']);
        }

        $uriSegments= explode('/',trim($uri,'/'));

        foreach($this->routes as $route){

            $routeSegments=explode('/',trim($route['uri'],'/'));

            $match=false;

            if(count($uriSegments)===count($routeSegments)&& strtoupper($route['method']===$requestMethod))
            {
                $params=[];
                $match=true;
                for($i=0;$i<count($uriSegments);$i++){
                    if($routeSegments[$i]!==$uriSegments[$i]&& !preg_match('/\{(.+?)\}/',$routeSegments[$i])){
                        $match = false;
                        break;
                    }
                if(preg_match('/\{(.+?)\}/',$routeSegments[$i],$matches)){
                    $params[$matches[1]]=$uriSegments[$i];
                }
            }
                
            }
        if($match){

            foreach($route['middleware'] as $middleware){
                (new Authorise())->handle($middleware);
            }
            $controller = 'App\\Controllers\\'.$route['controller'];
            $controllerMethod = $route['controllerMethod'];

            $controllerInstance = new $controller();
            $controllerInstance ->$controllerMethod($params);
            return;
        }
        }
        ErrorController::notFound();
    }
}
    
